---
title: StreamProvider
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import CodeBlock from "@theme/CodeBlock";
import { trimSnippet } from "../../../../../src/components/CodeSnippet";

`StreamProvider` è simile a [FutureProvider] ma finalizzato per gli [Stream]s
invece che per i [Future]s.

`StreamProvider` è solitamente usato per:

- stare in ascolto di Firebase o web-sockets
- ricostruire un altro provider ogni pochi secondi

Dato che gli [Stream]s espongono naturalmente un modo per stare in ascolto degli aggiornamenti,
alcuni potrebbero pensare che l'utilizzo di `StreamProvider` abbia poco valore.
In particolare, potresti credere che [StreamBuilder] di Flutter funzioni altrettanto bene per ascoltare uno [Stream], ma questo è un errore

Usare `StreamProvider` al posto di [StreamBuilder] ha numerosi vantaggi:

- permette ad altri provider di stare in ascolto dello stream usando [ref.watch].
- assicura una corretta gestione dei casi di caricamento/errore, grazie ad [AsyncValue].
- rimuove la necessità di differenziare gli streams di trasmissione (broadcast streams)
  con gli stream normali.
- memorizza l'ultimo valore emesso dallo stream, assicurandosi che se un
  listener viene aggiunto dopo l'emissione di un evento, il listener avrà comunque
  accesso immediato all'evento più recente/aggiornato.
- facilita la finzione dello stream durante i test sovrascrivendo lo `StreamProvider`.

[ref.watch]: ../concepts/reading#usare-refwatch-per-osservare-un-provider
[statenotifierprovider]: ./state_notifier_provider
[provider]: ./provider
[futureprovider]: ./future_provider
[asyncvalue]: https://pub.dev/documentation/riverpod/latest/riverpod/AsyncValue-class.html
[future]: https://api.dart.dev/dart-async/Future-class.html
[stream]: https://api.dart.dev/dart-async/Stream-class.html
[stream.periodic]: https://api.dart.dev/stable/2.15.1/dart-async/Stream/Stream.periodic.html
[family]: ../concepts/modifiers/family
[streambuilder]: https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
